home *** CD-ROM | disk | FTP | other *** search
- OPT OSVERSION=37
-
- MODULE 'dos/dos'
-
- ENUM ERR_NONE,ERR_READARGS,ERR_OPENREAD,ERR_EXAMINEFH,ERR_READ,ERR_READSHORT,
- ERR_OPENWRITE,ERR_WRITE,ERR_WRITESHORT
-
- PROC main() HANDLE
- DEF ver,args[4]:ARRAY OF LONG,rdargs=NIL,code,code2,
- fhread=0,fib=0:PTR TO fileinfoblock,infilesize,buffer:PTR TO CHAR,read,
- outfilesize,changes,fhwrite=0,written
-
- ver:='$VER: nocode 1.1 (19.7.99)'
- args:=[NIL,NIL,NIL,NIL]
- buffer:=NIL
-
- IF (rdargs:=ReadArgs('INFILE/A,OUTFILE,C=CODE/N/A,R=REPLACECODE/N',args,NIL))=NIL THEN Raise(ERR_READARGS)
- PrintF('\s\n',ver+6)
- PrintF('--\n')
- IF args[1]=NIL THEN args[1]:=args[0]
- code:=args[2]
- code:=^code
- IF (code2:=args[3]) THEN code2:=^code2
- IF (fhread:=Open(args[0],MODE_OLDFILE))=0 THEN Raise(ERR_OPENREAD)
- NEW fib
- IF (ExamineFH(fhread,fib))=FALSE THEN Raise(ERR_EXAMINEFH)
- infilesize:=fib.size
- END fib
- fib:=0
- NEW buffer[infilesize]
- PrintF('Reading "\s"... ',args[0])
- IF (read:=Read(fhread,buffer,infilesize))=-1 THEN Raise(ERR_READ)
- IF (read<>infilesize) THEN Raise(ERR_READSHORT)
- PrintF('read \d bytes.\n',read)
- Close(fhread)
- fhread:=0
- IF args[3]
- outfilesize:=infilesize
- changes:=replacecode(buffer,infilesize,code,code2)
- ELSE
- outfilesize:=removecode(buffer,infilesize,code)
- ENDIF
- IF (fhwrite:=Open(args[1],MODE_NEWFILE))=0 THEN Raise(ERR_OPENWRITE)
- IF args[1]=args[0]
- PrintF('Overwriting "\s"... ',args[1])
- ELSE
- PrintF('Writing "\s"... ',args[1])
- ENDIF
- IF (written:=Write(fhwrite,buffer,outfilesize))=-1 THEN Raise(ERR_WRITE)
- IF (written<>outfilesize) THEN Raise(ERR_WRITESHORT)
- PrintF('wrote \d bytes.\n\n',written)
- EXCEPT DO
- IF fhwrite THEN Close(fhwrite)
- IF buffer THEN END buffer
- IF fib THEN END fib
- IF fhread THEN Close(fhread)
- IF rdargs THEN FreeArgs(rdargs)
- SELECT exception
- CASE ERR_READARGS
- PrintF('nocode - Bad commandline arguments (ReadArgs).\n')
- CASE ERR_OPENREAD
- PrintF('Cannot open "\s" for reading (Open).\n',args[0])
- CASE ERR_EXAMINEFH
- PrintF('Cannot examine filehandle (ExamineFH).\n')
- CASE ERR_READ
- PrintF('Cannot read "\s" (Read).\n',args[0])
- CASE ERR_READSHORT
- PrintF('Cannot read "\s" - read data short (Read).\n',args[0])
- CASE ERR_OPENWRITE
- PrintF('Cannot open "\s" for writing (Open).\n',args[1])
- CASE ERR_WRITE
- PrintF('Cannot write "\s" (Write).\n',args[1])
- CASE ERR_WRITESHORT
- PrintF('Cannot write "\s" - written data short (Write).\n',args[1])
- CASE "MEM"
- PrintF('Cannot allocate enough (approx. \d bytes) memory (NEW).\n',infilesize)
- ENDSELECT
- ENDPROC
-
- PROC removecode(buffer,bufferlen,code)
- DEF outfilesize
-
- PrintF('Removing code \d... ',code)
- MOVE.L buffer,A0 -> buffer pointer 1
- MOVE.L A0,A1 -> buffer pointer 2
- MOVE.L A0,A2 -> store pointer to buffer start
- MOVE.L code,D0 -> cache code in D0
- MOVE.L bufferlen,D1 -> buffer length
- SUBQ.L #1,D1 -> decrement for dbcc
- ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
- BRA.S startouterloop
- outerloop:
- SWAP D1 -> fetch lower word of counter
- innerloop:
- MOVE.B (A0),(A1)+
- CMP.B (A0)+,D0
- BNE.S dontremove
- LEA -1(A1),A1
- dontremove:
- DBF D1,innerloop
- startouterloop:
- SWAP D1 -> fetch upper word of counter
- DBF D1,outerloop
- SUB.L A2,A1 -> subtract buffer start pointer from pointer 2
- MOVE.L A1,outfilesize
- PrintF('done (\d characters removed).\n',bufferlen-outfilesize)
- ENDPROC outfilesize
-
- PROC replacecode(buffer,bufferlen,code,code2)
- DEF changes
-
- PrintF('Replacing code \d with code \d... ',code,code2)
- MOVE.L buffer,A0 -> buffer pointer
- MOVE.L code,D0 -> cache code in D0
- MOVE.L code2,D2 -> cache code2 in D0
- MOVE.L bufferlen,D1 -> buffer length
- SUBQ.L #1,D1 -> decrement for dbcc
- ADD.L #$10000,D1 -> increment upper word (outerloop must jump to innerloop at least once)
- MOVEQ #0,D3
- BRA.S startouterloop2
- outerloop2:
- SWAP D1 -> fetch lower word of counter
- innerloop2:
- CMP.B (A0)+,D0
- BNE.S dontreplace
- MOVE.B D2,-1(A0)
- ADDQ.L #1,D3
- dontreplace:
- DBF D1,innerloop2
- startouterloop2:
- SWAP D1 -> fetch upper word of counter
- DBF D1,outerloop2
- MOVE.L D3,changes
- PrintF('done (\d characters replaced).\n',changes)
- ENDPROC changes
-